<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Update extends Admin_Controller {

	private $installed = false;
	
	function __construct()
	{
		parent::__construct('admin');
		$this->installed = class_exists('ZipArchive');
	}
	
	public function index()
	{
		$vData = array(
			'installed' => $this->installed
		);

		if ($haveUpdate = is_file($file = rootDir().'update/trunk.zip'))
		{
			$vData['fileSize'] = round(filesize($file)/1024, 2);
			$vData['zipComment'] = '';
			if ($this->installed)
			{
				$za = new ZipArchive();
				$za->open($file);
				// $vData['zipComment'] = iconv('windows-1251', 'UTF-8', $za->getArchiveComment());
				$vData['zipComment'] = $za->getArchiveComment();
				$za->close();
			}
		}

		$data = array(
			'content' =>
				$this->load->view('admin/update/menu', $vData, true).
				$this->load->view('admin/update/'.($haveUpdate?'success':'no_update'), $vData, true)
		);
		
		$this->getPage($data);
	}

	public function phpinfo()
	{
		phpinfo();
	}

	public function process()
	{
		if (!$this->installed) {
			die('Install ZipArchive class, please');
		}

		$file = rootDir().'update/trunk.zip';
		if (!is_file($file)) {
			die('No updates!');
		}

		if (!is_writable(rootDir())) {
			die('Скрипт не может заменить обновленные файлы. Проверьте права доступа');
		}

		$za = new ZipArchive();
		$za->open($file);

		$extractFiles = array();

		if (!is_dir(rootDir().'update/backups')) {
			mkdir(rootDir().'update/backups');
		}

		$backupZip = new ZipArchive();
		$backupFilename = 'update/backups/'.date('Y.m.d_H.i.s').'.zip';
		if ($backupZip->open(rootDir().$backupFilename, ZIPARCHIVE::CREATE) !== TRUE) {
		    echo "<i>Невозможно создать бэкап</i><br>";
		}

		for ($i=0; $i<$za->numFiles;$i++)
		{
			$stat = $za->statIndex($i);
			if (!$stat['size'])
			{
				if (is_dir(rootDir().$stat['name']))
					chmod(rootDir().$stat['name'], DIR_WRITE_MODE);
				continue;
			}
				
			if (substr($stat['name'], -4) == '.sql')
			{
				if ($content = $za->getFromName($stat['name']))
				{
					echo 'SQL: '.$stat['name']."<br>";
					$queries = explode(';', $content);
					foreach ($queries as $query) {
						if ($query = trim($query)) {
							$this->db->query(trim($query));
						}
					}
				}
			} else {
				echo $stat['name']."<br>";

				if (is_file(rootDir().$stat['name'])) {
					chmod(rootDir().$stat['name'], FILE_WRITE_MODE);
					$backupZip->addFile(rootDir().$stat['name'], $stat['name']);
				}

				$extractFiles[]=$stat['name'];
			}
		}
		
		$backupZip->close();
		echo 'Бэкап создан: '.$backupFilename."<br>";

// echo printR($extractFiles);
		/*echo '<hr>';
		echo rootDir();
		echo '<br>';
		echo '<br>';
		echo var_export(is_writable(rootDir()));
		echo '<br>';
		echo substr(sprintf('%o', fileperms(rootDir())), -4);
		echo '<br>';
		echo substr(sprintf('%o', fileperms(rootDir().'application')), -4);
		echo '<br>';
		echo substr(sprintf('%o', fileperms(rootDir().'application/config')), -4);
		echo '<br>';
		// chmod(rootDir().'application/config/constants.php', '0777');
		echo substr(sprintf('%o', fileperms(rootDir().'application/config/constants.php')), -4);
		echo '<br>';*/
		$za->extractTo(rootDir(), $extractFiles);
		
		// echo '<br>';
		$za->close();
		echo  '<hr>Обновление завершено<br>';
		if (unlink($file)) {
			echo  'Файл обновления удален';
		} else {
			echo  'Файл обновления не удален. Проверьте права доступа.';
		}
	}
}